JavaScript ã€ãã¬ãŒã¿ãã«ããŒã«ãã䞊ååŠçã®åãæ¢æ±ãããã©ãŒãã³ã¹ãåäžãããåæå®è¡ãæé©åããäžçäžã®ãŠãŒã¶ãŒåãã«ã¢ããªã±ãŒã·ã§ã³ã®é床ãåäžãããŸãã
JavaScript ã€ãã¬ãŒã¿ãã«ããŒã®äžŠååŠçããã©ãŒãã³ã¹ïŒåæåŠçé床
çŸä»£ã®ãŠã§ãéçºã«ãããŠãããã©ãŒãã³ã¹ã¯æãéèŠã§ããJavaScript éçºè
ã¯ãã³ãŒããæé©åããããé«éã§å¿çæ§ã®é«ãã¢ããªã±ãŒã·ã§ã³ãæäŸããæ¹æ³ãåžžã«æš¡çŽ¢ããŠããŸããæ¹åã®äœå°ãããåéã® 1 ã€ã¯ãmapãfilterãreduce ãªã©ã®ã€ãã¬ãŒã¿ãã«ããŒã®äœ¿çšã§ãããã®èšäºã§ã¯ã䞊ååŠçãæŽ»çšããŠãããã®ãã«ããŒã®ããã©ãŒãã³ã¹ã倧å¹
ã«åäžãããåæå®è¡ãšã倿§ãªã€ã³ã¿ãŒãããé床ãšããã€ã¹æ©èœãåããäžçäžã®ãŠãŒã¶ãŒã«å¯Ÿå¿ããã¢ããªã±ãŒã·ã§ã³é床ãžã®åœ±é¿ã«çŠç¹ãåœãŠãŸãã
JavaScript ã€ãã¬ãŒã¿ãã«ããŒã®çè§£
JavaScript ã«ã¯ãé åããã®ä»ã®å埩å¯èœãªãªããžã§ã¯ããç°¡åã«æäœã§ãããããã€ãã®çµã¿èŸŒã¿ã€ãã¬ãŒã¿ãã«ããŒãçšæãããŠããŸãããããã«ã¯ä»¥äžãå«ãŸããŸãã
map(): é åå ã®åèŠçŽ ã倿ãã倿ãããå€ãæã€æ°ããé åãè¿ããŸããfilter(): æå®ãããæ¡ä»¶ãæºããèŠçŽ ã®ã¿ãå«ãæ°ããé åãäœæããŸããreduce(): é åã®èŠçŽ ã 1 ã€ã®å€ã«éçŽããŸããforEach(): é åã®åèŠçŽ ã«å¯ŸããŠãæäŸããã颿°ã 1 åå®è¡ããŸããevery(): é åå ã®ãã¹ãŠã®èŠçŽ ãæ¡ä»¶ãæºãããŠãããã©ããã確èªããŸããsome(): é åå ã®å°ãªããšã 1 ã€ã®èŠçŽ ãæ¡ä»¶ãæºãããŠãããã©ããã確èªããŸããfind(): æ¡ä»¶ãæºããé åå ã®æåã®èŠçŽ ãè¿ããŸããfindIndex(): æ¡ä»¶ãæºããé åå ã®æåã®èŠçŽ ã®ã€ã³ããã¯ã¹ãè¿ããŸãã
ãããã®ãã«ããŒã¯äŸ¿å©ã§è¡šçŸåè±ãã§ãããéåžžã¯é çªã«å®è¡ãããŸããã€ãŸããåèŠçŽ ã¯ 1 ã€ãã€åŠçãããå€§èŠæš¡ãªããŒã¿ã»ãããèšç®è² è·ã®é«ãæäœã®ããã«ããã¯ã«ãªãå¯èœæ§ããããŸãã
䞊ååŠçã®å¿ èŠæ§
ç»åã®å€§èŠæš¡ãªé
åãåŠçããããããã«ãã£ã«ã¿ãŒãé©çšããå¿
èŠãããã·ããªãªãèããŠã¿ãŸããããæšæºã® map() 颿°ã䜿çšããå Žåãç»åã¯äžåºŠã« 1 ã€ãã€åŠçãããŸããããã¯ãç¹ã«ãã£ã«ã¿ãªã³ã°ããã»ã¹ãè€éãªå Žåãããªãã®æéããããå¯èœæ§ããããŸããã€ã³ã¿ãŒãããæ¥ç¶ãé
ãå°åã«ãããŠãŒã¶ãŒã®å Žåããã®é
å»¶ã«ããããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãã€ã©ã€ã©ããå¯èœæ§ããããŸãã
䞊ååŠçã¯ãã¯ãŒã¯ããŒããè€æ°ã®ã¹ã¬ãããŸãã¯ããã»ã¹ã«åæ£ããããšã§è§£æ±ºçãæäŸããŸããããã«ãããè€æ°ã®èŠçŽ ãåæã«åŠçã§ãããããå šäœã®åŠçæéãå€§å¹ ã«ççž®ãããŸãããã®ã¢ãããŒãã¯ãCPU ããŠã³ãã¿ã¹ã¯ãã€ãŸãããã«ããã¯ã I/O æäœã§ã¯ãªã CPU ã®åŠçèœåã§ããå Žåã«ç¹ã«åœ¹ç«ã¡ãŸãã
䞊åã€ãã¬ãŒã¿ãã«ããŒã®å®è£
JavaScript ã§äžŠåã€ãã¬ãŒã¿ãã«ããŒãå®è£
ããæ¹æ³ã¯ããã€ããããŸããäžè¬çãªã¢ãããŒãã® 1 ã€ã¯ãWeb Worker ã䜿çšããããšã§ããããã«ãããã¡ã€ã³ã¹ã¬ããããããã¯ããã«ãããã¯ã°ã©ãŠã³ãã§ JavaScript ã³ãŒããå®è¡ã§ããŸãããã 1 ã€ã®ã¢ãããŒãã¯ãéåæé¢æ°ãš Promise.all() ã䜿çšããŠæäœãåæã«å®è¡ããããšã§ãã
Web Worker ã®äœ¿çš
Web Worker ã¯ãã¡ã€ã³ã¹ã¬ãããšã¯ç¬ç«ããŠããã¯ã°ã©ãŠã³ãã§ã¹ã¯ãªãããå®è¡ããæ¹æ³ãæäŸããŸããããã¯ãUI ããããã¯ããå¯èœæ§ã®ããèšç®è² è·ã®é«ãã¿ã¹ã¯ã«æé©ã§ããWeb Worker ã䜿çšã㊠map() æäœã䞊ååããæ¹æ³ã®äŸã次ã«ç€ºããŸãã
äŸ: Web Worker ã䜿çšãã䞊å Map
// ã¡ã€ã³ã¹ã¬ãã
const data = Array.from({ length: 1000 }, (_, i) => i);
const numWorkers = navigator.hardwareConcurrency || 4; // å©çšå¯èœãª CPU ã³ã¢ã䜿çš
const chunkSize = Math.ceil(data.length / numWorkers);
const results = new Array(data.length);
let completedWorkers = 0;
for (let i = 0; i < numWorkers; i++) {
const start = i * chunkSize;
const end = Math.min(start + chunkSize, data.length);
const chunk = data.slice(start, end);
const worker = new Worker('worker.js');
worker.postMessage({ chunk, start });
worker.onmessage = (event) => {
const { result, startIndex } = event.data;
for (let j = 0; j < result.length; j++) {
results[startIndex + j] = result[j];
}
completedWorkers++;
if (completedWorkers === numWorkers) {
console.log('䞊å map ãå®äºããŸãã:', results);
}
worker.terminate();
};
worker.onerror = (error) => {
console.error('Worker ãšã©ãŒ:', error);
worker.terminate();
};
}
// worker.js
self.onmessage = (event) => {
const { chunk, start } = event.data;
const result = chunk.map(item => item * 2); // äŸã®å€æ
self.postMessage({ result, startIndex: start });
};
ãã®äŸã§ã¯ãã¡ã€ã³ã¹ã¬ããã¯ããŒã¿ããã£ã³ã¯ã«åå²ããåãã£ã³ã¯ãåå¥ã® Web Worker ã«å²ãåœãŠãŸããå worker ã¯ãã£ã³ã¯ãåŠçããçµæãã¡ã€ã³ã¹ã¬ããã«è¿ããŸããæ¬¡ã«ãã¡ã€ã³ã¹ã¬ããã¯çµæãæçµçãªé åã«çµã¿ç«ãŠãŸãã
Web Worker ã®èæ ®äºé :
- ããŒã¿è»¢é: ããŒã¿ã¯ã
postMessage()ã¡ãœããã䜿çšããŠã¡ã€ã³ã¹ã¬ãããš Web Worker ã®éã§è»¢éãããŸããããã«ã¯ãããŒã¿ã®ã·ãªã¢ã«åãšãã·ãªã¢ã«åãå«ãŸããŠãããããã©ãŒãã³ã¹ã®ãªãŒããŒãããã«ãªãå¯èœæ§ããããŸããå€§èŠæš¡ãªããŒã¿ã»ããã®å Žåã¯ãããŒã¿ã®ã³ããŒãåé¿ããããã«è»¢éå¯èœãªãªããžã§ã¯ãã®äœ¿çšãæ€èšããŠãã ããã - è€éã: Web Worker ã®å®è£ ã¯ãã³ãŒãã«è€éããå ããå¯èœæ§ããããŸããã¯ãŒã«ãŒã®äœæãéä¿¡ãããã³çµäºã管çããå¿ èŠããããŸãã
- ãããã°: Web Worker ã¯ã¡ã€ã³ã¹ã¬ãããšã¯å¥ã®ã³ã³ããã¹ãã§å®è¡ãããããããããã°ãå°é£ã«ãªãå¯èœæ§ããããŸãã
éåæé¢æ°ãš Promise.all() ã®äœ¿çš
䞊ååŠçãžã®ãã 1 ã€ã®ã¢ãããŒãã¯ãéåæé¢æ°ãš Promise.all() ã䜿çšããããšã§ããããã«ããããã©ãŠã¶ã®ã€ãã³ãã«ãŒãã䜿çšããŠè€æ°ã®æäœãåæã«å®è¡ã§ããŸããæ¬¡ã«äŸã瀺ããŸãã
äŸ: éåæé¢æ°ãš Promise.all() ã䜿çšãã䞊å Map
async function processItem(item) {
// éåææäœãã·ãã¥ã¬ãŒã
await new Promise(resolve => setTimeout(resolve, 10));
return item * 2;
}
async function parallelMap(data, processItem) {
const promises = data.map(item => processItem(item));
return Promise.all(promises);
}
const data = Array.from({ length: 100 }, (_, i) => i);
parallelMap(data, processItem)
.then(results => {
console.log('䞊å map ãå®äºããŸãã:', results);
})
.catch(error => {
console.error('ãšã©ãŒ:', error);
});
ãã®äŸã§ã¯ãparallelMap() 颿°ã¯ãããŒã¿ã®é
åãšåŠç颿°ãå
¥åãšããŠåãåããŸããããã¯ãããŒã¿é
åå
ã®èŠçŽ ã«åŠç颿°ãé©çšããçµæã衚ããpromise ã®é
åãäœæããŸããæ¬¡ã«ãPromise.all() ã¯ãã¹ãŠã® promise ã解決ãããã®ãåŸ
ã¡ãçµæã®é
åãè¿ããŸãã
éåæé¢æ°ãš Promise.all() ã®èæ ®äºé :
- ã€ãã³ãã«ãŒã: ãã®ã¢ãããŒãã¯ãéåææäœãåæã«å®è¡ããããã«ãã©ãŠã¶ã®ã€ãã³ãã«ãŒãã«äŸåããŠããŸããããã¯ããµãŒããŒããã®ããŒã¿ã®ãã§ãããªã©ãI/O ããŠã³ãã¿ã¹ã¯ã«é©ããŠããŸãã
- ãšã©ãŒåŠç: ããããã® promise ãæåŠããããšã
Promise.all()ã¯æåŠãããŸããã¢ããªã±ãŒã·ã§ã³ãã¯ã©ãã·ã¥ããªãããã«ããšã©ãŒãé©åã«åŠçããå¿ èŠããããŸãã - åæå®è¡æ°ã®å¶é: å®è¡ããŠããåææäœã®æ°ã«æ³šæããŠãã ãããåææäœãå€ããããšããã©ãŠã¶ãå§åãããããã©ãŒãã³ã¹ãäœäžããå¯èœæ§ããããŸããã¢ã¯ãã£ã㪠promise ã®æ°ãå¶åŸ¡ããããã«ãåæå®è¡æ°ã®å¶éãå®è£ ããå¿ èŠãããå ŽåããããŸãã
ãã³ãããŒã¯ãšããã©ãŒãã³ã¹æž¬å®
䞊åã€ãã¬ãŒã¿ãã«ããŒãå®è£ ããåã«ãã³ãŒãããã³ãããŒã¯ããããã©ãŒãã³ã¹ã®åäžã枬å®ããããšãéèŠã§ãããã©ãŠã¶ã®éçºè ã³ã³ãœãŒã«ãå°çšã®ãã³ãããŒã¯ã©ã€ãã©ãªãªã©ã®ããŒã«ã䜿çšããŠã䞊ååŠçã®æç¡ã«ããããããã³ãŒãã®å®è¡æéãæž¬å®ããŸãã
äŸ: console.time() ãš console.timeEnd() ã®äœ¿çš
console.time('ã·ãŒã±ã³ã·ã£ã« map');
const sequentialResults = data.map(item => item * 2);
console.timeEnd('ã·ãŒã±ã³ã·ã£ã« map');
console.time('䞊å map');
parallelMap(data, processItem)
.then(results => {
console.timeEnd('䞊å map');
console.log('䞊å map ãå®äºããŸãã:', results);
})
.catch(error => {
console.error('ãšã©ãŒ:', error);
});
å®è¡æéãæž¬å®ããããšã§ã䞊ååŠçãå®éã«ã³ãŒãã®ããã©ãŒãã³ã¹ãåäžãããŠãããã©ããã倿ã§ããŸããã¹ã¬ãããŸã㯠promise ã®äœæãšç®¡çã®ãªãŒããŒãããã¯ãç¹ã«å°ããªããŒã¿ã»ãããŸãã¯åçŽãªæäœã®å Žåã䞊ååŠçã®å©ç¹ãäžåãå Žåãããããšã«æ³šæããŠãã ããããããã¯ãŒã¯ã¬ã€ãã³ã·ããŠãŒã¶ãŒããã€ã¹ã®æ©èœ (CPUãRAM)ãããã³ãã©ãŠã¶ã®ããŒãžã§ã³ãªã©ã®èŠå ã¯ãããã©ãŒãã³ã¹ã«å€§ãã圱é¿ããå¯èœæ§ããããŸãããã¡ã€ããŒæ¥ç¶ã䜿çšããŠããæ¥æ¬ã®ãŠãŒã¶ãŒã¯ãã¢ãã€ã«ããã€ã¹ã䜿çšããŠããã¢ã«ãŒã³ãã³ã®å°æ¹ã®ãŠãŒã¶ãŒãšã¯ç°ãªããšã¯ã¹ããªãšã³ã¹ã«ãªãå¯èœæ§ããããŸãã
å®éã®äŸãšãŠãŒã¹ã±ãŒã¹
䞊åã€ãã¬ãŒã¿ãã«ããŒã¯ã以äžãå«ãå¹ åºãå®éã®ãŠãŒã¹ã±ãŒã¹ã«é©çšã§ããŸãã
- ç»ååŠç: ãã£ã«ã¿ãŒã®é©çšãç»åã®ãµã€ãºå€æŽããŸãã¯ç»å圢åŒã®å€æãããã¯ã倿°ã®è£œåç»åã衚瀺ãã e ã³ããŒã¹ Web ãµã€ãã«ç¹ã«é¢é£ããŸãã
- ããŒã¿åæ: å€§èŠæš¡ãªããŒã¿ã»ããã®åŠçãèšç®ã®å®è¡ãã¬ããŒãã®çæãããã¯ãéèã¢ããªã±ãŒã·ã§ã³ãšç§åŠã·ãã¥ã¬ãŒã·ã§ã³ã«ãšã£ãŠäžå¯æ¬ ã§ãã
- ãããªãšã³ã³ãŒã/ãã³ãŒã: ãããªã¹ããªãŒã ã®ãšã³ã³ãŒããŸãã¯ãã³ãŒãããããªãšãã§ã¯ãã®é©çšããŸãã¯ãµã ãã€ã«ã®çæãããã¯ããããªã¹ããªãŒãã³ã°ãã©ãããã©ãŒã ãšãããªç·šéãœãããŠã§ã¢ã«ãšã£ãŠéèŠã§ãã
- ã²ãŒã éçº: ç©çã·ãã¥ã¬ãŒã·ã§ã³ã®å®è¡ãã°ã©ãã£ãã¯ã®ã¬ã³ããªã³ã°ããŸãã¯ã²ãŒã ããžãã¯ã®åŠçã
äžçç㪠e ã³ããŒã¹ãã©ãããã©ãŒã ãèããŠã¿ãŸããããããŸããŸãªåœã®ãŠãŒã¶ãŒããããŸããŸãªãµã€ãºãšåœ¢åŒã®è£œåç»åãã¢ããããŒãããŸãã衚瀺åã«ãããã®ç»åãæé©åããããã«äžŠååŠçã䜿çšãããšãããŒãžèªã¿èŸŒã¿æéãå€§å¹ ã«æ¹åããå Žæãã€ã³ã¿ãŒãããé床ã«é¢ä¿ãªãããã¹ãŠã®ãŠãŒã¶ãŒã®ãšã¯ã¹ããªãšã³ã¹ãåäžãããããšãã§ããŸããããšãã°ãç»åãåæã«ãµã€ãºå€æŽãããšãçºå±éäžåœã®äœéæ¥ç¶ã䜿çšããŠãããŠãŒã¶ãŒã§ããã補åã«ã¿ãã°ããã°ããé²èЧã§ããããã«ãªããŸãã
䞊ååŠçã®ãã¹ããã©ã¯ãã£ã¹
æé©ãªããã©ãŒãã³ã¹ã確ä¿ããäžè¬çãªèœãšã穎ãåé¿ããã«ã¯ã䞊åã€ãã¬ãŒã¿ãã«ããŒãå®è£ ãããšãã«ã次ã®ãã¹ããã©ã¯ãã£ã¹ã«åŸã£ãŠãã ããã
- é©åãªã¢ãããŒããéžæãã: ã¿ã¹ã¯ã®æ§è³ªãšããŒã¿ã»ããã®ãµã€ãºã«åºã¥ããŠãé©åãªäžŠååŠçææ³ãéžæããŸããWeb Worker ã¯äžè¬çã« CPU ããŠã³ãã¿ã¹ã¯ã«é©ããŠãããéåæé¢æ°ãš
Promise.all()㯠I/O ããŠã³ãã¿ã¹ã¯ã«é©ããŠããŸãã - ããŒã¿è»¢éãæå°éã«æãã: ã¹ã¬ãããŸãã¯ããã»ã¹éã§è»¢éããå¿ èŠãããããŒã¿ã®éãæžãããŸããå¯èœãªå Žåã¯ã転éå¯èœãªãªããžã§ã¯ãã䜿çšããŠããŒã¿ã®ã³ããŒãåé¿ããŸãã
- ãšã©ãŒãé©åã«åŠçãã: ã¢ããªã±ãŒã·ã§ã³ãã¯ã©ãã·ã¥ããªãããã«ãå ç¢ãªãšã©ãŒåŠçãå®è£ ããŸããtry-catch ãããã¯ã䜿çšããæåŠããã promise ãé©åã«åŠçããŸãã
- ããã©ãŒãã³ã¹ãç£èŠãã: ã³ãŒãã®ããã©ãŒãã³ã¹ãç¶ç¶çã«ç£èŠããæœåšçãªããã«ããã¯ãç¹å®ããŸãããããã¡ã€ãªã³ã°ããŒã«ã䜿çšããŠãæé©åã®é åãç¹å®ããŸãã
- åæå®è¡æ°ã®å¶éãèæ ®ãã: åæå®è¡æäœãå€ãããŠã¢ããªã±ãŒã·ã§ã³ãå§åãããªãããã«ãåæå®è¡æ°ã®å¶éãå®è£ ããŸãã
- ããŸããŸãªããã€ã¹ãšãã©ãŠã¶ã§ãã¹ããã: ããŸããŸãªããã€ã¹ãšãã©ãŠã¶ã§ã³ãŒããé©åã«å®è¡ãããããšã確èªããŸãããã©ãŠã¶ãšããã€ã¹ã«ãã£ãŠãç°ãªãå¶éãšããã©ãŒãã³ã¹ç¹æ§ãããå ŽåããããŸãã
- ã°ã¬ãŒã¹ãã«ãã°ã©ããŒã·ã§ã³: 䞊ååŠçããŠãŒã¶ãŒã®ãã©ãŠã¶ãŸãã¯ããã€ã¹ã§ãµããŒããããŠããªãå Žåã¯ãã°ã¬ãŒã¹ãã«ã«ã·ãŒã±ã³ã·ã£ã«åŠçã«ãã©ãŒã«ããã¯ããŸããããã«ãããå€ãç°å¢ã§ãã¢ããªã±ãŒã·ã§ã³ãæ©èœãç¶ããããšãä¿èšŒãããŸãã
çµè«
䞊ååŠçã¯ãJavaScript ã€ãã¬ãŒã¿ãã«ããŒã®ããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããããé«éã§å¿çæ§ã®é«ãã¢ããªã±ãŒã·ã§ã³ã«ã€ãªããå¯èœæ§ããããŸããWeb Worker ãéåæé¢æ°ãªã©ã®ææ³ã掻çšããããšã§ãã¯ãŒã¯ããŒããè€æ°ã®ã¹ã¬ãããŸãã¯ããã»ã¹ã«åæ£ããããŒã¿ãåæã«åŠçã§ããŸãããã ãã䞊ååŠçã®ãªãŒããŒããããæ éã«æ€èšããç¹å®ã®ãŠãŒã¹ã±ãŒã¹ã«é©ããã¢ãããŒããéžæããããšãéèŠã§ãããã³ãããŒã¯ãããã©ãŒãã³ã¹ç£èŠãããã³ãã¹ããã©ã¯ãã£ã¹ã®éµå®ã¯ãæé©ãªããã©ãŒãã³ã¹ãšã倿§ãªæè¡çæ©èœãšã€ã³ã¿ãŒãããã¢ã¯ã»ã¹é床ãåããäžçäžã®ãŠãŒã¶ãŒã«ãšã£ãŠãããžãã£ããªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã確ä¿ããããã«äžå¯æ¬ ã§ããããŸããŸãªå°åã§ãããŸããŸãªãããã¯ãŒã¯ç¶æ³ãããã€ã¹ã®å¶éã«é©å¿ã§ããããã«ãã¢ããªã±ãŒã·ã§ã³ãèšèšããããšãå¿ããªãã§ãã ããã